// 通过class关键字定义一个类 构造函数的另一种写法
// 定义一个Person类构造函数
class Person {
  // 构造器 构造函数 构造器如果没有显示提供 默认提供一个空的构造器
  constructor(name, age, gender) {
    // 1.创建一个实例对象
    // 2.this->实例对象
    // 3.执行函数体的代码
    // 4.返回实例对象

    // 写在构造器里面的属性是实例的私有属性
    this.name = name;
    this.age = age;
    this.gender = gender;
  }
  // 写在类体里面的属性也是实例私有属性
  test = [];
  static test1 = 'hello';
  // 存放到类构造函数的原型对象中
  // 实例的公共方法
  sayName() {
    console.log('我是原型中的方法')
  }
  // 静态属性 和静态方法 --只能由类本身去调用 通过static关键字创造静态属性和方法
  static attr = '我是一个静态属性';
  // static isPerson(p){
  //   return p instanceof Person
  // }
  static isPerson() {
    return this.test1
  }
};
Person.attr1 = '我是静态属性2';
console.log(Person, '类');
let p = new Person('lerry', 55, '男');
let p1 = new Person();
// console.log(p,'打印实例对象');
p.sayName();
console.log(p.sayName === p1.sayName, '存放到原型对象中');
let result = Person.isPerson();
// let result1 = Person.isPerson({});
console.log(result,'静态方法的this指向类' );
console.log(Person.attr);
// 写到类体里里面的属性是私有属性
p.test.push('tom');
p1.test1 = '我是私有属性test1';
console.log(p, p1, '写到类体里里面的属性是私有属性');
// 实例使用属性和方法
//   私有属性 公共方法 类构造器里面  原型对象中
// 静态属性和静态方法
//   类构造函数本身去调用 